package cn.ld.module.ai.service.image;

import cn.ld.framework.ai.core.model.midjourney.api.MidjourneyApi;
import cn.ld.framework.common.pojo.PageResult;
import cn.ld.module.ai.controller.admin.image.vo.*;
import cn.ld.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionInVO;
import cn.ld.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineInVO;
import cn.ld.module.ai.dal.entity.image.AiImageEntity;
import jakarta.validation.Valid;

import java.util.List;

/**
 * AI 绘图 Service 接口
 *
 * @author fansili
 */
public interface AiImageService {

    /**
     * 获取【我的】绘图分页
     *
     * @param userId 用户编号
     * @param pageInVO 分页条件
     * @return 绘图分页
     */
    PageResult<AiImageEntity> getImagePageMy(Long userId, AiImagePageInVO pageInVO);

    /**
     * 获取公开的绘图分页
     *
     * @param pageInVO 分页条件
     * @return 绘图分页
     */
    PageResult<AiImageEntity> getImagePagePublic(AiImagePublicPageInVO pageInVO);

    /**
     * 获得绘图记录
     *
     * @param id 绘图编号
     * @return 绘图记录
     */
    AiImageEntity getImage(Long id);

    /**
     * 获得绘图列表
     *
     * @param ids 绘图编号数组
     * @return 绘图记录列表
     */
    List<AiImageEntity> getImageList(List<Long> ids);

    /**
     * 绘制图片
     *
     * @param userId 用户编号
     * @param drawInVO 绘制请求
     * @return 绘画编号
     */
    Long drawImage(Long userId, AiImageDrawInVO drawInVO);

    /**
     * 删除【我的】绘画记录
     *
     * @param id 绘画编号
     * @param userId 用户编号
     */
    void deleteImageMy(Long id, Long userId);

    /**
     * 获得绘画分页
     *
     * @param pageInVO 分页查询
     * @return 绘画分页
     */
    PageResult<AiImageEntity> getImagePage(AiImagePageInVO pageInVO);

    /**
     * 更新绘画
     *
     * @param updateInVO 更新信息
     */
    void updateImage(@Valid AiImageUpdateInVO updateInVO);

    /**
     * 删除绘画
     *
     * @param id 编号
     */
    void deleteImage(Long id);

    // ================ midjourney 专属 ================

    /**
     * 【Midjourney】生成图片
     *
     * @param userId 用户编号
     * @param inVO 绘制请求
     * @return 绘画编号
     */
    Long midjourneyImagine(Long userId, AiMidjourneyImagineInVO inVO);

    /**
     * 【Midjourney】同步图片进展
     *
     * @return 同步成功数量
     */
    Integer midjourneySync();

    /**
     * 【Midjourney】通知图片进展
     *
     * @param notify 通知
     */
    void midjourneyNotify(MidjourneyApi.Notify notify);

    /**
     * 【Midjourney】Action 操作(放大、缩小、U1、U2...)
     *
     * @param userId 用户编号
     * @param inVO 绘制请求
     * @return 绘画编号
     */
    Long midjourneyAction(Long userId, AiMidjourneyActionInVO inVO);

}
